package com.sky.controller.user;

import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import com.sky.result.Result;
import com.sky.service.ShoppingCartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j//开启日志记录
@Api(tags = "用户购物车相关接口")
@RequiredArgsConstructor//构造函数注入,final修饰的成员变量会自动注入
@CrossOrigin//解决跨域问题
public class shoppingCartController {

    private final ShoppingCartService shoppingCartService; //注入service层对象

    /**
     * ### 基本信息
     * <p>
     * **Path：** /user/shoppingCart/add
     * <p>
     * **Method：** POST
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     */
    @ApiOperation("商品添加到购物车")
    @PostMapping("/add")
    public Result<String> addShoppingCart(@RequestBody ShoppingCartDTO shoppingCartDTO) {
        //1.记录日志
        log.info("添加购物车：{}", shoppingCartDTO);
        //2.调用service层方法,业务:添加购物车
        shoppingCartService.addShoppingCart(shoppingCartDTO);
        //3.返回统一的结果result对象
        return Result.success("成功添加到购物车");

    }

    /**
     * <p>
     * **Path：** /user/shoppingCart/list
     * <p>
     * **Method：** GET
     * <p>
     * 查询购物车列表,用于前端小程序显示
     * <p>
     * 查询购物车表中满足条件的记录,返回给前端,前端展示
     * <p>
     * 用户的id存放在线程变量threadLocal中,从threadLocal中获取用户id,查询购物车表中该用户的记录,返回给前端
     */
    @ApiOperation("获取用户的购物车列表,用于前端小程序显示")
    @GetMapping("/list")
    public Result<List<ShoppingCart>> listShoppingCart() {
        //1.记录日志
        log.info("获取购物车列表");
        //2.业务:根据线程变量中的用户id查询购物车列表
        List<ShoppingCart> shoppingCarts = shoppingCartService.listShoppingCart();
        //3.返回统一的结果result对象
        return Result.success(shoppingCarts);

    }

    /**
     * **Path：** /user/shoppingCart/clean
     * <p>
     * **Method：** DELETE
     */
    @ApiOperation("清空购物车")
    @DeleteMapping("/clean")
    public Result<String> cleanShoppingCart() {
        //1.记录日志
        log.info("清空购物车");
        //2.业务:清空购物车
        shoppingCartService.cleanShoppingCart();
        //3.返回统一的结果result对象
        return Result.success("成功清空购物车");
    }

    /**
     * 删除购物车中一个商品
     * <p>
     * **Path：** /user/shoppingCart/sub
     * <p>
     * **Method：** POST
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     */
    @ApiOperation("减少/删除购物车中一个商品")
    @PostMapping("/sub")
    public Result<String> subShoppingCart(@RequestBody ShoppingCartDTO shoppingCartDTO) {
        //1.记录日志
        log.info("删除购物车中一个商品：{}", shoppingCartDTO);
        //2.业务:删除购物车中一个商品
        shoppingCartService.subShoppingCart(shoppingCartDTO);
        //3.返回统一的结果result对象
        return Result.success("成功删除购物车中一个商品");
    }
}
